package com.blank.shop.dubbo.consumer;

import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import com.blank.shop.dubbo.ShopAlibabaDubboApplication;
import com.blank.shop.dubbo.api.EchoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * <br/>Date 2021/8/31
 * <br/>Time 20:13:44
 *
 * @author _blank
 */
@Slf4j
@Profile({ShopAlibabaDubboApplication.SERVER_PROFILE_CONSUMER})
@EnableScheduling
@Component
public class ConsumerEchoService implements CommandLineRunner {

    private final Snowflake snowflake = IdUtil.getSnowflake();

    @DubboReference
    private EchoService echoService;

    /**
     * 1、fixedDelay控制方法执行的间隔时间，是以上一次方法执行完开始算起，如上一次方法执行阻塞住了，那么直到上一次执行完，并间隔给定的时间后，执行下一次。
     * 2、fixedRate是按照一定的速率执行，是从上一次方法执行开始的时间算起，如果上一次方法阻塞住了，下一次也是不会执行，但是在阻塞这段时间内累计应该执行的次数，当不再阻塞时，一下子把这些全部执行掉，而后再按照固定速率继续执行。
     * 3、cron表达式可以定制化执行任务，但是执行的方式是与fixedDelay相近的，也是会按照上一次方法结束时间开始算起。
     * 4、initialDelay 。如： @Scheduled(initialDelay = 10000,fixedRate = 15000 这个定时器就是在上一个的基础上加了一个initialDelay = 10000 意思就是在容器启动后,延迟10秒后再执行一次定时器,以后每15秒再执行一次该定时器。
     */
    @Scheduled(fixedDelay = 2000L, initialDelay = 3000L)
    public void scheduled() {
        final String echo = this.echoService.echo(snowflake.nextIdStr());
        log.info("scheduled，{}！", echo);
    }

    @Override
    public void run(String... args) throws Exception {
        log.info("服务调用方开始调用服务！");
        for (int i = 0; i < 32; i++) {
            final String echo = this.echoService.echo(RandomUtil.randomString(16));
            log.info("第{}次，{}！", i, echo);
        }
        log.info("服务调用方结束调用服务！");
    }

}
